package com.jyh.order;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

@SpringBootApplication
@EnableFeignClients // 开启远程调用功能
public class OrderMainApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderMainApplication.class, args);
    }

    /**
     * 创建并配置ApplicationRunner bean
     * 该bean在应用启动后，执行指定的操作，这里用于监听Nacos配置变化
     *
     * @param manager NacosConfigManager实例，用于与Nacos配置服务交互
     * @return ApplicationRunner实例，用于执行应用启动后的操作
     */
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager manager){
        return args -> {
            // 获取Nacos配置服务实例
            ConfigService configService = manager.getConfigService();
            // 为特定的配置文件添加监听器
            // 这里监听"service-order.properties"配置文件的变化
            configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {
                /**
                 * 返回一个固定大小的线程池，用于异步处理配置变更
                 *
                 * @return Executor实例，用于异步执行任务
                 */
                @Override
                public Executor getExecutor() {
                    // 创建一个包含4个线程的固定大小线程池
                    return Executors.newFixedThreadPool(4);
                }

                /**
                 * 当监听的配置信息发生变化时，该方法被调用
                 *
                 * @param configInfo 变更后的配置信息
                 */
                @Override
                public void receiveConfigInfo(String configInfo) {
                    // 打印变更后的配置信息
                    System.out.println("configInfo = " + configInfo);
                }
            });
        };
    }
}